package javatelephone;
import java.io.*;
import java.net.*;

public class SendMessage implements Runnable {
   private ObjectOutputStream salida;
   private ObjectInputStream entrada;
   private String mensaje = "";
   private String servidorChat;
   private Socket cliente; 
   private boolean conected;
   public boolean isConected() {
        return conected;
    }

   public void setConected(boolean conected) {
        this.conected = conected;
    }
   public SendMessage(String host)
   {
       this.servidorChat = host;// establecer el servidor al que se va a conectar este cliente
       this.conected = false;
   }
    private void conectToServer() throws IOException 
    {
      System.out.println("");
      cliente = new Socket( InetAddress.getByName( servidorChat ), 12345 );
      System.out.println("Conectado a: " + cliente.getInetAddress().getHostName() );
      setConected(true);
    }

    private void procesarConexion() throws IOException
    {
        do 
        { // procesar mensajes enviados del servidor
         // leer mensaje y mostrarlo en pantalla
            try 
            {
                mensaje = ( String ) entrada.readObject();
                mostrarMensaje( "\n" + mensaje );
                sendMessage(mensaje);
                System.out.println(mensaje);
            }// atrapar los problemas que pueden ocurrir al leer del servidor
            catch ( ClassNotFoundException excepcionClaseNoEncontrada ) 
            {
                mostrarMensaje( "\nSe recibió un objeto de tipo desconocido" );
            }

        } while ( !mensaje.equals( "SERVIDOR>>> TERMINAR" ) );
    }

    private void obtenerFlujos() throws IOException {
         // establecer flujo de salida para los objetos
      salida = new ObjectOutputStream( cliente.getOutputStream() );      
      salida.flush(); // vacíar búfer de salida para enviar información de encabezado

      // establecer flujo de entrada para los objetos
      entrada = new ObjectInputStream( cliente.getInputStream() );
    }

    private void mostrarMensaje(String string) {
        System.out.println(string);
    }
    
    private void cerrarConexion() 
    {
      mostrarMensaje( "\nCerrando conexión" );
      try 
      {
         salida.close();
         entrada.close();
         cliente.close();
      }
      catch( IOException excepcionES ) {
         excepcionES.printStackTrace();
      }
    }
    // enviar mensaje al servidor
    public void sendMessage( String mensaje ) throws IOException
    {
      // enviar objeto al servidor
         salida.writeObject(mensaje);
         salida.flush();
    }
    @Override
    public void run()
    {
       // conectarse al servidor, obtener flujos, procesar la conexión
      try 
      {
         conectToServer(); // Paso 1: crear un socket para realizar la conexión
         obtenerFlujos();      // Paso 2: obtener los flujos de entrada y salida
         procesarConexion(); // Paso 3: procesar la conexión
      }
      // el servidor cerró la conexión
      catch ( EOFException excepcionEOF ) {
         System.err.println( "El cliente termino la conexión" );
      }
      // procesar los problemas que pueden ocurrir al comunicarse con el servidor
      catch ( IOException excepcionES ) {
      }

      finally {
         cerrarConexion(); // Paso 4: cerrar la conexión
      } 
    }
}
